﻿using System;

namespace _019_简化数组初始化表达式
{
    class Program
    {
        static void Main(string[] args)
        {
            // 第一种是省略new运算符和类型限制条件
            char[] vowels = { 'a', 'e', 'i', 'o', 'u' };
            int[,] rectangularMatrix =
            {
                { 0, 1, 2 },
                { 3, 4, 5 },
                { 6, 7, 8 }
            };
            int[][] jaggedMatrix =
            {
                new int[]{ 0, 1, 2 },
                new int[]{ 3, 4, 5 },
                new int[]{ 6, 7, 8 }
            };

            // 第二种是使用var关键字，使编译器隐式确定局部变量类型。
            var i = 3; // i被隐式确定成int
            var s = "sausage"; // s被隐式确定成string
            // 因此：
            var rectMatrix = new int[,] // rectMatrix隐式确定成 int[,]
            {
                { 0, 1, 2 },
                { 3, 4, 5 },
                { 6, 7, 8 }
            };
            var jaggedMat = new int[][] // jaggedMat隐式确定成int[][]
            {
                    new int[]{ 0, 1, 2 },
                    new int[]{ 3, 4, 5 },
                    new int[]{ 6, 7, 8 }
            };
            // 隐式类型转换能进一步用于一维数组的这种情况。
            // 能在new关键字之后忽略类型限定符，而由编译器推断数组类型
            var vowels1 = new[] { 'a', 'e', 'i', 'o', 'u' }; // 编译器推断成char[]
            // 为了使隐式确定数组类型正常工作，所有的元素都必须可以隐式转换成同一种类型。
            var x = new[] { 1, 10000000000 }; // 所有的元素都可转换成long
        }
    }
}